home *** CD-ROM | disk | FTP | other *** search
/ Aminet 21 / Aminet 21 (1997)(GTI - Schatztruhe)[!][Oct 1997].iso / Aminet / dev / e / Chris_emods.lha / execlists.e < prev    next >
Text File  |  1997-08-21  |  3KB  |  159 lines

  1. -> buildlist.e - Example which uses an application-specific Exec list
  2.  
  3. OPT MODULE, REG = 5
  4.  
  5. MODULE 'exec/lists', 'exec/nodes', 'amigalib/lists'
  6.  
  7. CONST DATASIZE=62
  8.  
  9. OBJECT nameNode
  10.   ln:ln               -> System Node structure
  11.   data[DATASIZE]:ARRAY  -> Node-specific data
  12. ENDOBJECT
  13.  
  14. CONST NAMENODE_ID=100  -> The type of 'nameNode'
  15.  
  16. -> Allocate a NameNode structure, copy the given name into the structure, then
  17. -> add it the specified list.  This example does not provide an error return
  18. -> for the out of memory condition.
  19. -> E-Note: ...instead it raises an exception which is handled by the caller
  20. EXPORT PROC addName(list, name)
  21.   DEF namenode:PTR TO nameNode
  22.   NEW namenode
  23.   -> E-Note: copy *safely* to namenode.data
  24.   AstrCopy(namenode.data, name, DATASIZE)
  25.   namenode.ln.name := namenode.data
  26.   namenode.ln.type := NAMENODE_ID
  27.   namenode.ln.pri  := 0
  28.   AddTail(list, namenode)
  29. ENDPROC
  30.  
  31. EXPORT PROC freeNode(list:PTR TO lh, num)
  32.   DEF node:PTR TO ln, count, found
  33.  
  34.   IF list.tailpred <> list
  35.     count := 0
  36.     node  := list.head
  37.     found := FALSE
  38.     WHILE (found = FALSE) AND (node.succ)
  39.       IF count = num
  40.         found := TRUE
  41.       ELSE
  42.         node := node.succ
  43.         INC count
  44.       ENDIF
  45.     ENDWHILE
  46.   ENDIF
  47.   IF found
  48.     Remove(node)
  49.     IF node.succ
  50.       RETURN num
  51.     ELSE
  52.       RETURN num - 1
  53.     ENDIF
  54.   ENDIF
  55. ENDPROC
  56.  
  57. -> Free the entire list, including the header.  The header is not updated as
  58. -> the list is freed.  This function demonstrates how to avoid referencing
  59. -> freed memory when deallocating nodes.
  60. EXPORT PROC freeNameNodes(list:PTR TO lh)
  61.   DEF worknode:PTR TO nameNode, nextnode
  62.   worknode := list.head  -> First node
  63.   WHILE nextnode := worknode.ln.succ
  64.     END worknode
  65.     worknode := nextnode
  66.   ENDWHILE
  67.   newList(list)
  68. ENDPROC
  69.  
  70. EXPORT PROC findNodeNumber(list:PTR TO lh, str)
  71.   DEF node:PTR TO ln, count, found
  72.  
  73.   IF list.tailpred <> list
  74.     count := 0
  75.     node  := list.head
  76.     found := FALSE
  77.     WHILE (found = FALSE) AND (node.succ)
  78.       IF StrCmp(node.name, str)
  79.         found := TRUE
  80.       ELSE
  81.         node := node.succ
  82.         INC count
  83.       ENDIF
  84.     ENDWHILE
  85.   ENDIF
  86. ENDPROC IF found THEN count ELSE 0
  87.  
  88. EXPORT PROC findNodeName(list:PTR TO lh, number)
  89.   DEF node:PTR TO ln, count
  90.  
  91.   IF list.tailpred <> list
  92.     count := 0
  93.     node  := list.head
  94.     WHILE node.succ AND (count < number)
  95.       node := node.succ
  96.       INC count
  97.     ENDWHILE
  98.     RETURN node.name
  99.   ENDIF
  100. ENDPROC
  101.  
  102. EXPORT PROC movelistnode(l1:PTR TO lh, pos1, l2:PTR TO lh, pos2)
  103.   DEF pn:PTR TO ln, copynode = NIL:PTR TO lh, i
  104.   DEF forwards
  105.  
  106.   IF (pos2 < 0) OR (pos2 >= countnodes(l2)) THEN RETURN pos1
  107.  
  108.   IF     (pos1 > pos2); forwards := FALSE
  109.   ELSEIF (pos1 < pos2); forwards := TRUE
  110.   ENDIF
  111.  
  112.   IF l1 = l2
  113.     IF (pos1 = pos2) THEN RETURN pos1
  114.     IF forwards = FALSE THEN INC pos2
  115.     IF forwards         THEN INC pos1
  116.   ENDIF
  117.  
  118.   pn := l1
  119.   i := 0
  120.   WHILE (i < pos1) AND pn.succ
  121.    pn := pn.succ
  122.    INC i
  123.   ENDWHILE
  124.   copynode := pn
  125.   Remove(pn)
  126.  
  127.   pn := l2
  128.   i := 0
  129.   WHILE (i < pos2) AND pn.succ
  130.    pn := pn.succ
  131.    INC i
  132.   ENDWHILE
  133.   Insert(l2, copynode, pn)
  134.  
  135.   IF l1 = l2
  136.     IF forwards
  137.       RETURN i
  138.     ELSE
  139.       RETURN i - 1
  140.     ENDIF
  141.   ELSE
  142.     RETURN i
  143.   ENDIF
  144. ENDPROC
  145.  
  146. EXPORT PROC countnodes(list:PTR TO lh)
  147.   DEF node:PTR TO ln, count
  148.  
  149.   count := 0
  150.  
  151.   IF list.tailpred <> list
  152.     node  := list.head
  153.     WHILE (node.succ)
  154.       node := node.succ
  155.       INC count
  156.     ENDWHILE
  157.   ENDIF
  158. ENDPROC count
  159.